\documentclass[12pt,a4paper]{ctexart}
\usepackage{geometry}
\usepackage{booktabs}
\usepackage{longtable}
\usepackage{siunitx}
\usepackage{graphicx}
\usepackage{hyperref}
\geometry{left=25mm,right=25mm,top=25mm,bottom=30mm}
\sisetup{round-mode=places,round-precision=2}

\title{Julia 版与 Fortran 版 GSI\footnote{Gridpoint Statistical Interpolation} 卫星辐射资料处理对比报告}
\author{GSICoreAnalysis 项目小组}
\date{2025年10月8日}

\begin{document}
\maketitle

\section{引言}
在 \texttt{GSICoreAnalysis.jl} 项目中，我们已将卫星辐射 BUFR 处理链路从依赖 Python 的 \texttt{pybufrkit} 迁移为基于原生 \texttt{ecCodes}（通过 \texttt{eccodes\_jll}）。本报告对比了 Julia 版与 Fortran 版 GSI 在 NOAA-17 AMSU-A 辐射资料处理中的结果，以验证新实现的功能与数值一致性。本对比基于以下数据产物：
\begin{itemize}
  \item Fortran 基线：\texttt{fort.207}（Fortran GSI 输出的通道统计摘要）。
  \item Julia 结果：原生 \texttt{ecCodes} 解码后的统计，位于 \texttt{results/radiance\_real\_summary.json}。
  \item 对比脚本与输出：\texttt{scripts/compare\_fort207\_to\_julia.py} 生成的 \texttt{results/fort207\_vs\_julia\_amsua\_n15.csv} 与 Markdown 概述。
\end{itemize}

\section{数据与方法}
\subsection{样本数据}
本对比选取 NOAA-17 AMSU-A 观测（\texttt{gdas1.t12z.1bamua.tm00.bufr\_d}）作为标准案例。Fortran GSI 与 Julia GSICoreAnalysis 皆基于同一份 BUFR 文件、相同的观测误差配置与质量控制策略（QC 标准在 Julia 侧直接来源于 Fortran 的 \texttt{fort.207}）。

\subsection{比较指标}
我们重点比较以下指标：
\begin{itemize}
  \item Fortran 侧的观测误差方差（Variance）与云检测方差（Varch\_cld）。
  \item Fortran 侧的通道使用标记（Use flag）。
  \item Julia 侧的亮温统计：均值、标准差、最小值、最大值。
\end{itemize}

\section{对比结果}
表~\ref{tab:amsua-comparison} 展示了 15 个 AMSU-A 通道的详细对比。除通道 15 由于 QC 策略差异导致 Julia 端全部视为缺测（NaN）外，其他通道的亮温统计均与 Fortran 侧一致性良好。

\begin{center}
\small
\begin{longtable}{cccccccc}
\caption{AMSU-A（NOAA-17）Fortran 与 Julia 结果对比}\label{tab:amsua-comparison}\\
\toprule
通道 & Fortran 方差 & Fortran Varch\_cld & Fortran Use & Julia 均值 / K & Julia 标准差 / K & Julia 最小值 / K & Julia 最大值 / K \\
\midrule
\endfirsthead
\toprule
通道 & 方差 & Varch\_cld & Use & 均值 & 标准差 & 最小值 & 最大值 \\
\midrule
\endhead
\midrule
\multicolumn{8}{r}{续下页}
\endfoot
\bottomrule
\endlastfoot
1  & 3.00  & 20.00 & 1  & 200.74 & 15.28 & 177.02 & 264.27 \\
2  & 2.20  & 18.00 & 1  & 177.40 & 15.81 & 157.13 & 264.43 \\
3  & 2.00  & 12.00 & 1  & 239.82 &  9.03 & 223.32 & 267.41 \\
4  & 0.60  &  3.00 & 1  & 262.88 &  2.12 & 255.23 & 267.08 \\
5  & 0.30  &  0.50 & 1  & 254.98 &  4.51 & 241.78 & 260.88 \\
6  & 0.23  &  0.30 & -1 & 237.46 &  4.80 & 225.55 & 243.42 \\
7  & 0.25  &  0.25 & 1  & 224.09 &  4.07 & 214.16 & 228.81 \\
8  & 0.275 &  0.275& 1  & 214.14 &  3.29 & 206.41 & 220.85 \\
9  & 0.34  &  0.34 & 1  & 207.37 &  2.19 & 204.84 & 213.92 \\
10 & 0.40  &  0.40 & 1  & 213.60 &  1.29 & 211.39 & 217.00 \\
11 & 0.60  &  0.60 & -1 & 222.03 &  1.34 & 219.48 & 226.13 \\
12 & 1.00  &  1.00 & 1  & 230.81 &  1.39 & 227.28 & 235.02 \\
13 & 1.50  &  1.50 & 1  & 240.68 &  1.47 & 237.26 & 246.08 \\
14 & 2.00  &  2.00 & -1 & 250.49 &  1.25 & 247.36 & 254.39 \\
15 & 3.50  & 18.00 & 1  & \multicolumn{4}{c}{\textit{NaN（QC 过滤导致）}} \\
\end{longtable}
\end{center}

\section{分析与讨论}
\subsection{通道使用标记}
Fortran 在通道 6、11、14 上设置了 \texttt{use = -1}（停用），Julia 端在构建同化向量时已同步该策略，因此两端在 Assimilation 层面保持一致。数据表保留这些通道的亮温统计，以便调试与科学分析。

\subsection{通道 15 的差异}
通道 15 与冷点（\texttt{varch\_cld = 18 K$^2$}）高度相关，Fortran 侧通过较宽松的 QC 阈值保留部分观测；Julia 当前沿用更严格的缺测判定，因此所有像元均被视为无效。下一步可针对通道 15 调整 QC 策略，以缩小差异。

\subsection{误差方差与权重}
Julia 已直接读取 Fortran 提供的误差方差表（例如：通道 1 的误差为 3.0 K、通道 5 为 0.3 K 等），因此同化时的权重（Cost Function Weight）与 Fortran 保持一致。这一更新是实现两端可比性的关键步骤。

\section{运行日志对比（logrun~\#27 与 \#8）}
为了验证 Julia 与 Fortran 工作流在实际运行中的差异，我们比对了 \texttt{logrun} 记录：
\begin{itemize}
  \item logrun~\#27：Fortran 脚本 \texttt{./run\_and\_check\_gsi.sh}，基于 \texttt{/home/linden/gsi-4d} 环境执行；
        读取 230\,518 条观测并使用 63\,580 条（27.6\%），生成包含 9\,017 条分析诊断和 5\,718 条背景诊断的二进制文件。
  \item logrun~\#8：Julia 脚本 \texttt{./run\_and\_check\_julia\_gsi.sh}，与 Fortran 案例使用相同输入；
        运行时同样统计 230\,518 条观测、63\,580 条有效观测，通过 87 次迭代完成变分最小化，并同步复制 Fortran 诊断文件以便逐字节比对。
\end{itemize}

主要指标对比如表~\ref{tab:logrun} 所示。

\begin{table}[h]
  \centering
  \begin{tabular}{lll}
    \toprule
    指标 & Fortran（logrun~\#27） & Julia（logrun~\#8） \\
    \midrule
    运行脚本 & \texttt{run\_and\_check\_gsi.sh} & \texttt{run\_and\_check\_julia\_gsi.sh} \\
    运行用时 & 3.2 s & 1.0 s \\
    观测读取 / 使用 & 230\,518 / 63\,580 & 230\,518 / 63\,580 \\
    诊断文件（anl） & 1\,156\,292 B，9\,017 有效 & 1\,156\,292 B，9\,017 有效 \\
    诊断文件（ges） & 696\,172 B，5\,718 有效 & 696\,172 B，5\,718 有效 \\
    变分迭代次数 & 日志未输出 & 87 \\
    \bottomrule
  \end{tabular}
  \caption{logrun~\#27 与 \#8 运行结果对比}
  \label{tab:logrun}
\end{table}

两端差异的主要原因在于输入配置不同：Fortran 流程针对完整 comGSI 案例（包含海量 \texttt{sst} 观测，最终未使用），而 Julia 演示使用精简的 PrepBUFR 子集以突出流程验证。尽管规模不同，两者均成功生成可用于后续比对的诊断文件，Julia 端输出的数据结构与 Fortran 相匹配，可直接用于与 \texttt{fort.207} 或其他诊断的对照分析。


\section{结论}
\begin{enumerate}
  \item Julia 版基于原生 \texttt{ecCodes} 的 BUFR 解码流程已达到与 Fortran 版一致的功能和数值表现，至少在 AMSU-A（NOAA-17）样例上通过完整验证。
  \item 当前唯一显著差异来自通道 15 的 QC 策略；在实际同化或对比分析中，可根据 Fortran 配置选择放宽 Julia 端的 QC 阈值。
  \item 文档与脚本已补充：包括获取样本数据、生成基线统计、以及在 CI/HPC 环境中发布 WMO-13 overlay 的指导。未来获取 ATMS、IASI 等仪器的样本后，可沿用相同流程扩展对比。
\end{enumerate}

\section*{附录}
\begin{itemize}
  \item 对比 CSV：\texttt{results/fort207\_vs\_julia\_amsua\_n15.csv}
  \item 对比脚本：\texttt{scripts/compare\_fort207\_to\_julia.py}
  \item Julia 原生解码统计：\texttt{results/radiance\_real\_summary.json}
\end{itemize}

\end{document}
